const PROMISE_STATE = {
    PENDING: 'pending',
    FULFILLED: 'fulfilled',
    REJECTED: 'rejected'
}
// 有问题
// 当 存储时候没有将数据存储下来时候，读不出数据
// class MyPromise{
//     // 存储成功存储时的变量
//     #result
//     // 创建一个变量记录 状态
//     #state = PROMISE_STATE.PENDING
//     #reason
    
//     constructor(executor){
//         executor(this.#resolve, this.#reject)
//     }

//     #resolve = (result) => {
//         if(this.#state !== PROMISE_STATE.PENDING) return
//         this.#result = result
//         this.#state = PROMISE_STATE.FULFILLED
//     }

//     #reject = (reason) => {
//         this.#reason = reason
//         this.#state = PROMISE_STATE.REJECTED
//     }

//     then(onFulfilled, onRejected){
//         if(this.#state === PROMISE_STATE.FULFILLED){
//             onFulfilled(this.#result)
//         }
//     }
// }

// const mp = new MyPromise((resolve,reject)=>{
//     resolve('猪八戒')
//     resolve('孙悟空')
// })
// mp.then((result)=>{
//     console.log(result)
// })
// console.dir(mp)

// // 解决方法
// class MyPromise{
//     // 存储成功存储时的变量
//     #result
//     // 创建一个变量记录 状态
//     #state = PROMISE_STATE.PENDING
//     #reason

//     // 回调函数
//     #callback
    
//     constructor(executor){
//         executor(this.#resolve.bind(this), this.#reject.bind(this))
//     }

//     #resolve(result) {
//         if(this.#state !== PROMISE_STATE.PENDING) return
//         this.#result = result
//         this.#state = PROMISE_STATE.FULFILLED

//         // 当 resolve 执行时，说明数据已经进来了，需要调用 then 的回调函数
//         // 当 #callback 有值的时候调用，没有就不调用，避免#callback is not function 报错
//         this.#callback && this.#callback(this.#result)
//     }

//     #reject(reason) {
//         this.#reason = reason
//         this.#state = PROMISE_STATE.REJECTED
//     }

//     then(onFulfilled, onRejected){
//         if(this.#state === PROMISE_STATE.PENDING){
//             // 当数据还没传入进来，将回调函数设置为 #callback
//             this.#callback = onFulfilled
//         } else if(this.#state === PROMISE_STATE.FULFILLED){
//             onFulfilled(this.#result)
//         }
//     }
// }

// const mp = new MyPromise((resolve,reject)=>{
//     resolve('猪八戒')
//     resolve('孙悟空')
// })
// mp.then((result)=>{
//     console.log(result)
// })
// console.dir(mp)

// 解决方法
// 处理微任务队列问题
// class MyPromise{
//     // 存储成功存储时的变量
//     #result
//     // 创建一个变量记录 状态
//     #state = PROMISE_STATE.PENDING
//     #reason

//     // 回调函数
//     #callback
    
//     constructor(executor){
//         executor(this.#resolve.bind(this), this.#reject.bind(this))
//     }

//     #resolve(result) {
//         if(this.#state !== PROMISE_STATE.PENDING) return
//         this.#result = result
//         this.#state = PROMISE_STATE.FULFILLED

//         // 当 resolve 执行时，说明数据已经进来了，需要调用 then 的回调函数
//         // 当 #callback 有值的时候调用，没有就不调用，避免#callback is not function 报错
//         // this.#callback && this.#callback(this.#result)
//         queueMicrotask(()=>{
//             this.#callback && this.#callback(this.#result)
//         })
//     }

//     #reject(reason) {
//         this.#reason = reason
//         this.#state = PROMISE_STATE.REJECTED
//     }

//     then(onFulfilled, onRejected){
//         if(this.#state === PROMISE_STATE.PENDING){
//             // 当数据还没传入进来，将回调函数设置为 #callback
//             this.#callback = onFulfilled
//         } else if(this.#state === PROMISE_STATE.FULFILLED){
//             // onFulfilled(this.#result)
//             /*
//                 then 回调函数，应该在微任务队列中执行，而不是直接调用
//                 等到栈中的执行完才执行 微任务队列 变成真正的异步任务
//             */
//             queueMicrotask(()=>{
//                 onFulfilled(this.#result)
//             })
//         }
//     }
// }

// const mp = new MyPromise((resolve,reject)=>{
//     resolve('猪八戒')
//     resolve('孙悟空')
// })
// mp.then((result)=>{
//     console.log(result)
// })
// console.dir(mp)

// 解决方法
// 无法反复then读取数据
class MyPromise{
    // 存储成功存储时的变量
    #result
    // 创建一个变量记录 状态
    #state = PROMISE_STATE.PENDING
    #reason

    // 回调函数
    #callback
    
    constructor(executor){
        executor(this.#resolve.bind(this), this.#reject.bind(this))
    }

    #resolve(result) {
        if(this.#state !== PROMISE_STATE.PENDING) return
        this.#result = result
        this.#state = PROMISE_STATE.FULFILLED

        // 当 resolve 执行时，说明数据已经进来了，需要调用 then 的回调函数
        // 当 #callback 有值的时候调用，没有就不调用，避免#callback is not function 报错
        // this.#callback && this.#callback(this.#result)
        queueMicrotask(()=>{
            this.#callback && this.#callback(this.#result)
        })
    }

    #reject(reason) {
        this.#reason = reason
        this.#state = PROMISE_STATE.REJECTED
    }

    then(onFulfilled, onRejected){
        if(this.#state === PROMISE_STATE.PENDING){
            // 当数据还没传入进来，将回调函数设置为 #callback
            this.#callback = onFulfilled
        } else if(this.#state === PROMISE_STATE.FULFILLED){
            // onFulfilled(this.#result)
            /*
                then 回调函数，应该在微任务队列中执行，而不是直接调用
                等到栈中的执行完才执行 微任务队列 变成真正的异步任务
            */
            queueMicrotask(()=>{
                onFulfilled(this.#result)
            })
        }
    }
}

const mp = new MyPromise((resolve,reject)=>{
    resolve('猪八戒')
    resolve('孙悟空')
})
mp.then((result)=>{
    console.log(result)
})
console.dir(mp)